package com.xzcedu.reflection;

import java.lang.reflect.Field;

/**
 * @author 徐州城
 * @version 1.0
 * 演示反射操作属性
 */
public class ReflectionAccessProperty {
    public static void main(String[] args) throws Exception {

        //1. 得到Student对应的Class对象
        Class<?> stuClass = Class.forName("com.xzcedu.reflection.Student");

        //2. 创建对象
        Object o = stuClass.newInstance();//o 的运行类型就是 Student
        System.out.println(o.getClass());

        //3. 使用反射得到age 属性对象
        Field age = stuClass.getField("age");
        age.set(o, 100);//通过反射来操作属性。把得到的对象放入，设置age的值
        System.out.println(o);
        System.out.println(age.get(o));//直接返回age属性的值

        //4. 使用反射操作name 属性
        Field name = stuClass.getDeclaredField("name");
        //对name 进行暴破，可以操作private属性
        name.setAccessible(true);
        //name.set(o,"张三");
        name.set(null, "张三");//之所以可以使用null，是因为name是static的，静态属性所以实例共享
        System.out.println(o);
        System.out.println(name.get(null));
    }
}

class Student {
    private static String name;
    public int age;

    public Student() {//构造器
    }

    @Override
    public String toString() {
        return "Student [" +
                "age=" + age + ", name=" + name + ']';
    }
}
